import logging
from flask import render_template, current_app, session, request, jsonify, g
from info.models import User, News, Category
from info.until.common import outside
from info.until.response_code import RET
from . import index_blu
from info import sr, constants


@index_blu.route('/')
@outside
def index():
    """
    1.从redis中获取参数
    2.判断用户是否登入
    3.如果登入，则将数据库的数据发送到模板中
    4.如果没有登入，则给模板中返回None
    :return:
    """
    use_data= g.use

    # 给新闻主页面进行点击量排行
    new_data = []
    try:
        new_data = News.query.order_by(News.clicks.desc()).limit(constants.CLICK_RANK_MAX_NEWS)
    except Exception as e:
        logging.error(e)
    # 将模型对象列表转换为列表
    new_data_li = []
    for new in new_data:
        new_data_li.append(new.to_basic_dict())

    # 查询出所有的分类，并把分类给发送给前端
    cate_li = []
    cates = Category.query.all()  # 获取所有分类的模型对象
    for cate in cates:  # 将所有的模型对象列表转换为列表
        cate_li.append(cate.to_dict())

    data = {
        'use': use_data.to_dict() if use_data else None,
        'new_data_li': new_data_li,
        'cate_li': cate_li
    }

    return render_template('index.html', data=data)


# 访问静态文件夹下标题的小图标
@index_blu.route('/favicon.ico')
def favicon():
    return current_app.send_static_file('news/favicon.ico')


@index_blu.route('/news_list')
def news_list():
    """
    1.获取参数
    2.判断参数是否符合规范
    3.查询数据
    4.返回数据
    :return:
    """
    # 由于是get请求，所以把数据放在url的？后面，如果是post请求就放在ajax的参数上
    # 有一点要注意“最新”这个不是数据库的字段，它会显示全部的新闻列表
    # 获取参数

    cid = request.args.get('cid', "1")
    page = request.args.get('page', "1")
    per_page = request.args.get('per_page', "10")
    # 判断参数
    try:
        cid = int(cid)
        page = int(page)
        per_page = int(per_page)
    except Exception as e:
        logging.error(e)
        return jsonify(errno=RET.PARAMERR, errmsg='参数传入错误')
    # 获取数据
    filters = [News.status==0]
    if cid != 1:
        # 说明用户点击的是其他的分类，则需要将分类的数据传过去
        filters.append(News.category_id == cid)
    # 查询数据对象
    try:
        paginate = News.query.filter(*filters).order_by(News.create_time.desc()).paginate(page, per_page,False)
    except Exception as e:
        logging.error(e)
        return jsonify(errno=RET.DATAERR, errmsg='数据查询失败')
    # 获取当前对象的当前页数数据,当前页数，总页数
    new_item = paginate.items  # 模型对象列表
    new_page = paginate.page
    new_pages = paginate.pages
    # 将模型对象列表转换为列表
    new_item_li = list()
    for new in new_item:
        new_item_li.append(new.to_basic_dict())

    data = {
        'new_item_li': new_item_li,
        'new_page': new_page,
        'new_pages': new_pages,
    }
    return jsonify(errno=RET.OK, errmsg='ok', data=data)
